package com.hx.er.action.customer.user;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import com.hx.er.action.base.ErCustomerAction;
import com.hx.er.bean.base.LanguageBean;
import com.hx.er.bean.base.UserBean;
import com.hx.er.common.logic.SessionUtil;
import com.hx.er.common.system.Constants;
import com.hx.er.common.system.ErLanguages;
import com.hx.er.common.util.CharUtil;
import com.hx.er.common.util.MD5Util;
import com.hx.er.common.util.StringUtil;
import com.hx.er.service.customer.ICustomerRegisterService;
import com.opensymphony.xwork2.ActionContext;

/**
 * 用户注册页面Action
 * 
 * @author HX
 * @version 1.0
 * @since 1.0
 */
public class CustomerRegisterAction extends ErCustomerAction {
	private static final long serialVersionUID = 4926512300151605899L;

	private UserBean userBeanPage;
	private String confirmPassword;
	private String securityCode;
	private List<Integer> ageList;
	private List<LanguageBean> langList;
	private Map<String, String> sexMap;

	@Autowired
	private ICustomerRegisterService customerRegisterService;

	/**
	 * 初始化注册页面
	 * 
	 * @return
	 */
	public String init() {
		this.initInputPage();
		return SUCCESS;
	}

	/**
	 * 注册动作
	 * 
	 * @return 注册
	 */
	public String register() {
		// 页面校验
		if (!this.checkParams()) {

			// 失败后跳转页面前，初始化
			this.initInputPage();

			return INPUT;
		}

		// 用户权限： 9管理员/1店铺管理员/2普通用户
		this.userBeanPage.setUserTypeId(Constants.USER_TYPE_CUSTOMER);
		// 应为用户当前访问的餐馆ID，应当实现不同的域名指向不同的餐馆，不同的餐馆有不同的ID
		this.userBeanPage.setRestId(super.restId);
		// 密码MD5转换
		this.userBeanPage.setPassword(MD5Util.encodeMD5(this.userBeanPage.getPassword()));

		// 插入用户数据
		Map<String, Boolean> msgMap = this.customerRegisterService.insertCustomerWithoutId(userBeanPage);

		if (msgMap.isEmpty()) {
			// 登录，设置session中的用户bean
			ActionContext.getContext().getSession().put(Constants.SESSION_USER_INFO, this.userBeanPage);

			// 返回，页面跳转
			return SUCCESS;
		} else {
			if (msgMap.containsKey("msg.userName")) {
				this.addFieldError("msg.userName", "已有人使用这个用户名!");
			}
			if (msgMap.containsKey("msg.mobile")) {
				this.addFieldError("msg.mobile", "已有人使用这个手机号!");
			}
			if (msgMap.containsKey("msg.mail")) {
				this.addFieldError("msg.mail", "已有人使用这个邮箱地址!");
			}
			
			// 失败后跳转页面前，初始化
			this.initInputPage();
			
			return INPUT;
		}
	}

	/**
	 * 页面验证
	 */
	public boolean checkParams() {
		// 验证码验证
		if (StringUtil.isEmpty(securityCode)) {
			this.addFieldError("msg.securityCode", "验证码不能为空!");
			return false;
		} else if (!StringUtil.isEqual((String) super.request.getSession().getAttribute(Constants.SESSION_SECURITY_CODE), this.securityCode)) {
			this.addFieldError("msg.securityCode", "请输入正确的验证码!");
			return false;
		} else {
			// 如果验证码正确，则立即清除
			SessionUtil.removeAttribute(ActionContext.getContext(), Constants.SESSION_SECURITY_CODE);
		}

		// 用户名验证
		if (StringUtil.isEmpty(this.userBeanPage.getUserName())) {
			this.addFieldError("msg.userName", "用户名不能为空!");
		} else if (!StringUtil.isHalf(this.userBeanPage.getUserName())) {
			this.addFieldError("msg.userName", "用户名只能是半角字符!");
		} else if (!StringUtil.checkLength(this.userBeanPage.getUserName(), 4, 32)) {
			this.addFieldError("msg.userName", "用户名长度只能在4-32位之间!");
		} else if (!CharUtil.isLetter(this.userBeanPage.getUserName().charAt(0))) {
			this.addFieldError("msg.userName", "用户名首位必须是字母");
		}

		// 密码验证
		if (StringUtil.isEmpty(this.userBeanPage.getPassword())) {
			this.addFieldError("msg.password", "密码不能为空!");
		} else if (!StringUtil.checkLength(this.userBeanPage.getPassword(), 6, 16)) {
			this.addFieldError("msg.password", "密码长度只能在6-16位之间!");
		}

		// 重复密码验证
		if (StringUtil.isEmpty(this.confirmPassword)) {
			this.addFieldError("msg.confirmPassword", "密码确认不能为空!");
		} else if (!StringUtil.isEqual(this.confirmPassword, this.userBeanPage.getPassword())) {
			this.addFieldError("msg.confirmPassword", "两次输入的密码必须相同!");
		}

		// 昵称验证
		if (!StringUtil.isEmpty(this.userBeanPage.getNickName())) {
			if (!StringUtil.checkLength(this.userBeanPage.getNickName(), 0, 64)) {
				this.addFieldError("msg.nickName", "昵称长度不能超过64字节(32个汉字)!");
			}
		}

		// 邮箱验证
		if (!StringUtil.isEmpty(this.userBeanPage.getMail())) {
			if (!StringUtil.isHalf(this.userBeanPage.getMail())) {
				this.addFieldError("msg.mail", "邮箱地址只能是半角字符!");
			} else if (!StringUtil.checkLength(this.userBeanPage.getMail(), 0, 100)) {
				this.addFieldError("msg.mail", "邮箱地址长度不能超过100字节!");
			} else if (!StringUtil.isEmailAddr(this.userBeanPage.getMail())) {
				this.addFieldError("msg.mail", "邮件地址格式错误!");
			}
		}

		// 手机号码验证
		if (!StringUtil.isEmpty(this.userBeanPage.getMobile())) {
			if (!StringUtil.checkLength(this.userBeanPage.getMobile(), 0, 15)) {
				this.addFieldError("msg.mobile", "手机号长度不能超过15字节!");
			} else if (!StringUtil.isNumeric(this.userBeanPage.getMobile())) {
				this.addFieldError("msg.mobile", "手机号格式错误!");
			}
		}

		// 地址验证
		if (!StringUtil.isEmpty(this.userBeanPage.getAddress())) {
			if (!StringUtil.checkLength(this.userBeanPage.getAddress(), 0, 100)) {
				this.addFieldError("msg.address", "地址长度不能超过100字节!");
			}
		}

		// 描述验证
		if (!StringUtil.isEmpty(this.userBeanPage.getDescription())) {
			if (!StringUtil.checkLength(this.userBeanPage.getDescription(), 0, 255)) {
				this.addFieldError("msg.description", "描述长度不能超过255字节!");
			}
		}

		// 备注验证
		if (!StringUtil.isEmpty(this.userBeanPage.getRemark())) {
			if (!StringUtil.checkLength(this.userBeanPage.getRemark(), 0, 255)) {
				this.addFieldError("msg.remark", "备注长度不能超过255字节!");
			}
		}
		
		// 错误信息数量
		int errCount = this.getActionErrors().size() + this.getFieldErrors().size();

		return errCount == 0;
	}

	/**
	 * 初始化页面需要的下拉框等元素
	 */
	private void initInputPage() {
		// 初始化年龄，范围为1～100
		this.ageList = new ArrayList<Integer>();
		for (int i = 10; i < 100; i++) {
			this.ageList.add(i + 1);
		}

		// 初始化语言
		this.langList = ErLanguages.getLangList();

		// 初始化性别
		this.sexMap = new HashMap<String, String>();
		this.sexMap.put("0", "女");
		this.sexMap.put("1", "男");
	}

	public List<Integer> getAgeList() {
		return ageList;
	}

	public List<LanguageBean> getLangList() {
		return langList;
	}

	public Map<String, String> getSexMap() {
		return sexMap;
	}

	public UserBean getUserBeanPage() {
		return userBeanPage;
	}

	public void setUserBeanPage(UserBean userBeanPage) {
		this.userBeanPage = userBeanPage;
	}

	public String getConfirmPassword() {
		return confirmPassword;
	}

	public void setConfirmPassword(String confirmPassword) {
		this.confirmPassword = confirmPassword;
	}

	public void setSecurityCode(String securityCode) {
		this.securityCode = securityCode;
	}
}
